#include "util/json.h"

#include "base/config.h"
using namespace net_tools;
// EPOLL永久阻塞
int Config::EPOLL_FOREVER = -1;
// 让定时任务永久循环
int Config::TIMEJOB_FOREVER = -1;

std::string Config::APP_NAME = "DEFAULT NAME";
std::string Config::IP_ADDRESS = "127.0.0.1";
int Config::DEFAULT_PORT = 2599;

// channel pool 每次new个数
int Config::EACH_NEW_CHANNEL = 32;
// channel pool的默认大小
int Config::CHANNEL_DEFAULT_SIZE = 2048;
// wakeup任务队列初始大小
int Config::DEFAULT_WAKEUP_VECTOR_SIZE = 64;
// ACCEPT 的默认等待队列大小
int Config::MAX_WAIT_ACCEPT = 1024;
// connect pool 初始化时默认的connect个数
int Config::CONNECT_POOL_DEFAULT_SIZE = 1024;
// connect pool 每次new connect的个数
int Config::EACH_NEW_CONNECT = 32;
// 心跳系统每次心跳间隔事件 sec
int Config::HEARTBEAT_EVERY_SEC = 1;
int Config::HEARTBEAT_EVERY_USEC = 0;
// log线程多久默认刷入文件
int Config::SET_LOG_FLUSH_SEC = 1;
int Config::SET_LOG_FLUSH_USEC = 0;
// log缓冲区高水位的大小
int Config::SET_LOG_HIGHLEVEL = Config::SET_LOG_BUFFER_SIZE - 10241;
// 每个log文件的最大大小
size_t Config::SET_LOG_SET_FILE_MAX_SIZE = (1024 * 1024 * 500);
// 浮点及指针类型logstream的最大打印长度
int Config::SET_LOG_FMT_MAX_LEN = 32;
// 系统规定的最大连接数
int Config::MAX_CONNECT_NUMBER = 100000;
// cpu负载指数高于该值 则不接受新连接 %
int Config::HIGH_CPU_LOADAVG = 90;
// 默认消息包大小信息的长度
unsigned int Config::NET_BUFFER_LENDATA_SIZE = sizeof(unsigned int);
// 用于buffer的内存池默认每个数据块的大小
int Config::BUFFER_MEMPOOL_BLOCK_SIZE = 2048;
// 用于buffer的内存池默认的数据块个数
int Config::BUFFER_MEMPOOL_BLOCK_NUMBER = 100000;
// thread pool 默认线程数
int Config::WORK_THREAD_POOL_SIZE = 2;
// thread pool 默认每个线程可以排队任务的最大数量
int Config::WORK_THREAD_POOL_QUEUE_SIZE = 30;
// 默认的LOG输出最低等级
int Config::SET_LOG_OUTPUT_LEVEL = 0;
// tcp缓冲区的大小为4096 一个buffer块的大小为4096 缓冲区一次最多只能接收两个块
int Config::BUFFER_ONCE_WRITE_CALLBACK_IOVEC_SIZE = 10;
// tcp缓冲区的大小为4096 一个buffer块的大小为4096 缓冲区一次最多填满两个块
int Config::BUFFER_ONCE_READ_CALLBACK_IOVEC_SIZE = 10;
// Client每几秒钟检测一次是否发出心跳包
int Config::CLIENT_HEART_BEAT_EVERY_SEC = 7;
namespace net_tools
{

  Config::Config(std::string appname)
  {
    APP_NAME = appname;
    appname += ".json";
    Analyze(appname);
  };

  void Config::Analyze(const std::string &address)
  {
    util::Json json;
    if (json.Open_read(address))
    {
      Json::Value root;
      json.Read_from_ifs(&root);
      for (unsigned int count = 0; count < root.size(); ++count)
      {
        APP_NAME = root[count]["APP_NAME"].asString();
        IP_ADDRESS = root[count]["IP_ADDRESS"].asString();
        DEFAULT_PORT = root[count]["PORT"].asInt();
        CLIENT_HEART_BEAT_EVERY_SEC = root[count]["CLIENT_HEART_BEAT_EVERY_SEC"].asInt();
        WORK_THREAD_POOL_SIZE = root[count]["WORK_THREAD_POOL_SIZE"].asInt();
      }
    }
    else
    {
      json.Open_write(address);
      Json::Value root;
      Json::Value config;
      config["APP_NAME"] = APP_NAME;
      config["IP_ADDRESS"] = IP_ADDRESS;
      config["PORT"] = DEFAULT_PORT;
      config["CLIENT_HEART_BEAT_EVERY_SEC"] = CLIENT_HEART_BEAT_EVERY_SEC;
      config["WORK_THREAD_POOL_SIZE"] = WORK_THREAD_POOL_SIZE;
      root.append(config);
      json.Json_write(&root);
    }
  };

} // namespace net_tools